{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "38a72ebc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Files already downloaded and verified\n",
      "Files already downloaded and verified\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms\n",
    "\n",
    "transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])\n",
    "batch_size = 8\n",
    "train_dataset = torchvision.datasets.cifar.CIFAR100(root='cifar100', train=False, transform=transform, download=True)\n",
    "test_dataset = torchvision.datasets.cifar.CIFAR100(root='cifar100', train=False, transform=transform, download=True)\n",
    "train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=2)\n",
    "test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False, num_workers=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "50090097",
   "metadata": {},
   "source": [
    "## 展示数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "b43b2efc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([8])\n"
     ]
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "# functions to show an image\n",
    "\n",
    "\n",
    "def imshow(img):\n",
    "    img = img / 2 + 0.5     # unnormalize\n",
    "    npimg = img.numpy()\n",
    "    plt.imshow(np.transpose(npimg, (1, 2, 0)))\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "# get some random training images\n",
    "dataiter = iter(train_loader)\n",
    "# images, labels = dataiter.next()\n",
    "images, labels = next(dataiter)\n",
    "\n",
    "# show images\n",
    "imshow(torchvision.utils.make_grid(images))\n",
    "# print labels\n",
    "print(labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2402ebdf",
   "metadata": {},
   "source": [
    "## 定义模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "2efe2126",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SKNet(\n",
      "  (basic_conv): Sequential(\n",
      "    (0): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n",
      "    (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    (2): ReLU(inplace=True)\n",
      "  )\n",
      "  (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n",
      "  (stage_1): Sequential(\n",
      "    (0): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(64, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(128, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 128, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential(\n",
      "        (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (1): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(128, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 128, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (2): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(128, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 128, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "  )\n",
      "  (stage_2): Sequential(\n",
      "    (0): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 256, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential(\n",
      "        (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (1): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 256, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (2): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 256, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (3): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 256, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "  )\n",
      "  (stage_3): Sequential(\n",
      "    (0): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(512, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(2, 2), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (1): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (2): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (3): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (4): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (5): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (6): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (7): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (8): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (9): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (10): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (11): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (12): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (13): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (14): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (15): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (16): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (17): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (18): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (19): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (20): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (21): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (22): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(32, 512, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "  )\n",
      "  (stage_4): Sequential(\n",
      "    (0): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(1024, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(1024, 1024, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(1024, 1024, kernel_size=(3, 3), stride=(2, 2), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(1024, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(64, 1024, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential(\n",
      "        (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
      "        (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (1): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(2048, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(1024, 1024, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(1024, 1024, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(1024, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(64, 1024, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (2): SKUnit(\n",
      "      (conv1): Sequential(\n",
      "        (0): Conv2d(2048, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "        (2): ReLU(inplace=True)\n",
      "      )\n",
      "      (conv2_sk): SKConv(\n",
      "        (convs): ModuleList(\n",
      "          (0): Sequential(\n",
      "            (0): Conv2d(1024, 1024, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "          (1): Sequential(\n",
      "            (0): Conv2d(1024, 1024, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2), dilation=(2, 2), groups=32, bias=False)\n",
      "            (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "            (2): ReLU(inplace=True)\n",
      "          )\n",
      "        )\n",
      "        (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "        (fc): Sequential(\n",
      "          (0): Conv2d(1024, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "          (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "          (2): ReLU(inplace=True)\n",
      "        )\n",
      "        (fcs): ModuleList(\n",
      "          (0-1): 2 x Conv2d(64, 1024, kernel_size=(1, 1), stride=(1, 1))\n",
      "        )\n",
      "        (softmax): Softmax(dim=1)\n",
      "      )\n",
      "      (conv3): Sequential(\n",
      "        (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (shortcut): Sequential()\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "  )\n",
      "  (gap): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "  (classifier): Linear(in_features=2048, out_features=1000, bias=True)\n",
      ")\n"
     ]
    }
   ],
   "source": [
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "class BasicBlock(nn.Module):\n",
    "    expansion = 1\n",
    "\n",
    "    def __init__(self, in_channel, out_channel, stride=1, downsample=None, **kwargs):\n",
    "        super(BasicBlock, self).__init__()\n",
    "        self.conv1 = nn.Conv2d(in_channels=in_channel, out_channels=out_channel,\n",
    "                               kernel_size=3, stride=stride, padding=1, bias=False)\n",
    "        self.bn1 = nn.BatchNorm2d(out_channel)\n",
    "        self.relu = nn.ReLU()\n",
    "        self.conv2 = nn.Conv2d(in_channels=out_channel, out_channels=out_channel,\n",
    "                               kernel_size=3, stride=1, padding=1, bias=False)\n",
    "        self.bn2 = nn.BatchNorm2d(out_channel)\n",
    "        self.downsample = downsample\n",
    "\n",
    "    def forward(self, x):\n",
    "        identity = x\n",
    "        if self.downsample is not None:\n",
    "            identity = self.downsample(x)\n",
    "\n",
    "        out = self.conv1(x)\n",
    "        out = self.bn1(out)\n",
    "        out = self.relu(out)\n",
    "\n",
    "        out = self.conv2(out)\n",
    "        out = self.bn2(out)\n",
    "\n",
    "        out += identity\n",
    "        out = self.relu(out)\n",
    "\n",
    "        return out\n",
    "\n",
    "\n",
    "class Bottleneck(nn.Module):\n",
    "\n",
    "    expansion = 4\n",
    "\n",
    "    def __init__(self, in_channel, out_channel, stride=1, downsample=None, groups=1, width_per_group=64):\n",
    "        super(Bottleneck, self).__init__()\n",
    "\n",
    "        width = int(out_channel * (width_per_group / 64.)) * groups\n",
    "\n",
    "        self.conv1 = nn.Conv2d(in_channels=in_channel, out_channels=width,\n",
    "                               kernel_size=1, stride=1, bias=False)  # squeeze channels\n",
    "        self.bn1 = nn.BatchNorm2d(width)\n",
    "        # -----------------------------------------\n",
    "        self.conv2 = nn.Conv2d(in_channels=width, out_channels=width, groups=groups,\n",
    "                               kernel_size=3, stride=stride, bias=False, padding=1)\n",
    "        self.bn2 = nn.BatchNorm2d(width)\n",
    "        # -----------------------------------------\n",
    "        self.conv3 = nn.Conv2d(in_channels=width, out_channels=out_channel*self.expansion,\n",
    "                               kernel_size=1, stride=1, bias=False)  # unsqueeze channels\n",
    "        self.bn3 = nn.BatchNorm2d(out_channel*self.expansion)\n",
    "        self.relu = nn.ReLU(inplace=True)\n",
    "        self.downsample = downsample\n",
    "\n",
    "    def forward(self, x):\n",
    "        identity = x\n",
    "        if self.downsample is not None:\n",
    "            identity = self.downsample(x)\n",
    "\n",
    "        out = self.conv1(x)\n",
    "        out = self.bn1(out)\n",
    "        out = self.relu(out)\n",
    "\n",
    "        out = self.conv2(out)\n",
    "        out = self.bn2(out)\n",
    "        out = self.relu(out)\n",
    "\n",
    "        out = self.conv3(out)\n",
    "        out = self.bn3(out)\n",
    "\n",
    "        out += identity\n",
    "        out = self.relu(out)\n",
    "\n",
    "        return out\n",
    "\n",
    "\n",
    "class ResNet(nn.Module):\n",
    "\n",
    "    def __init__(self, block, blocks_num, num_classes=1000):\n",
    "        super(ResNet, self).__init__()\n",
    "        self.in_channel = 64\n",
    "\n",
    "        self.conv1 = nn.Conv2d(3, self.in_channel, kernel_size=7, stride=2, padding=3, bias=False)\n",
    "        self.bn1 = nn.BatchNorm2d(self.in_channel)\n",
    "        self.relu = nn.ReLU(inplace=True)\n",
    "        self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)\n",
    "        self.layer1 = self._make_layer(block, 64, blocks_num[0])\n",
    "        self.layer2 = self._make_layer(block, 128, blocks_num[1], stride=2)\n",
    "        self.layer3 = self._make_layer(block, 256, blocks_num[2], stride=2)\n",
    "        self.layer4 = self._make_layer(block, 512, blocks_num[3], stride=2)\n",
    "        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))\n",
    "        self.fc = nn.Linear(512 * block.expansion, num_classes)\n",
    "\n",
    "    def _make_layer(self, block, channel, block_num, stride=1):\n",
    "        downsample = None\n",
    "        if stride != 1 or self.in_channel != channel * block.expansion:\n",
    "            downsample = nn.Sequential(\n",
    "                nn.Conv2d(self.in_channel, channel * block.expansion, kernel_size=1, stride=stride, bias=False),\n",
    "                nn.BatchNorm2d(channel * block.expansion))\n",
    "\n",
    "        layers = []\n",
    "        layers.append(block(self.in_channel,\n",
    "                            channel,\n",
    "                            downsample=downsample,\n",
    "                            stride=stride))\n",
    "        self.in_channel = channel * block.expansion\n",
    "\n",
    "        for _ in range(1, block_num):\n",
    "            layers.append(block(self.in_channel, channel))\n",
    "\n",
    "        return nn.Sequential(*layers)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = self.conv1(x)\n",
    "        x = self.bn1(x)\n",
    "        x = self.relu(x)\n",
    "        x = self.maxpool(x)\n",
    "\n",
    "        x = self.layer1(x)\n",
    "        x = self.layer2(x)\n",
    "        x = self.layer3(x)\n",
    "        x = self.layer4(x)\n",
    "\n",
    "        x = self.avgpool(x)\n",
    "        x = torch.flatten(x, 1)\n",
    "        x = self.fc(x)\n",
    "\n",
    "        return x\n",
    "\n",
    "\n",
    "def resnet34(num_classes=100):\n",
    "    return ResNet(BasicBlock, [3, 4, 6, 3], num_classes=num_classes)\n",
    "\n",
    "def smallnet(num_classes=100):\n",
    "    return ResNet(BasicBlock, [2, 2, 2, 2], num_classes=num_classes)\n",
    "\n",
    "net = resnet34()\n",
    "#print(net)\n",
    "\n",
    "#sknet\n",
    "class SKConv(nn.Module):\n",
    "    def __init__(self, features, M=2, G=32, r=16, stride=1 ,L=32):\n",
    "        \"\"\" Constructor\n",
    "        Args:\n",
    "            features: input channel dimensionality.\n",
    "            M: the number of branchs.\n",
    "            G: num of convolution groups.\n",
    "            r: the ratio for compute d, the length of z.\n",
    "            stride: stride, default 1.\n",
    "            L: the minimum dim of the vector z in paper, default 32.\n",
    "        \"\"\"\n",
    "        super(SKConv, self).__init__()\n",
    "        d = max(int(features/r), L)\n",
    "        self.M = M\n",
    "        self.features = features\n",
    "        self.convs = nn.ModuleList([])\n",
    "        for i in range(M):\n",
    "            self.convs.append(nn.Sequential(\n",
    "                nn.Conv2d(features, features, kernel_size=3, stride=stride, padding=1+i, dilation=1+i, groups=G, bias=False),\n",
    "                nn.BatchNorm2d(features),\n",
    "                nn.ReLU(inplace=True)\n",
    "            ))\n",
    "        self.gap = nn.AdaptiveAvgPool2d((1,1))\n",
    "        self.fc = nn.Sequential(nn.Conv2d(features, d, kernel_size=1, stride=1, bias=False),\n",
    "                                nn.BatchNorm2d(d),\n",
    "                                nn.ReLU(inplace=True))\n",
    "        self.fcs = nn.ModuleList([])\n",
    "        for i in range(M):\n",
    "            self.fcs.append(\n",
    "                 nn.Conv2d(d, features, kernel_size=1, stride=1)\n",
    "            )\n",
    "        self.softmax = nn.Softmax(dim=1)\n",
    "        \n",
    "    def forward(self, x):\n",
    "        \n",
    "        batch_size = x.shape[0]\n",
    "        \n",
    "        feats = [conv(x) for conv in self.convs]      \n",
    "        feats = torch.cat(feats, dim=1)\n",
    "        feats = feats.view(batch_size, self.M, self.features, feats.shape[2], feats.shape[3])\n",
    "        \n",
    "        feats_U = torch.sum(feats, dim=1)\n",
    "        feats_S = self.gap(feats_U)\n",
    "        feats_Z = self.fc(feats_S)\n",
    "\n",
    "        attention_vectors = [fc(feats_Z) for fc in self.fcs]\n",
    "        attention_vectors = torch.cat(attention_vectors, dim=1)\n",
    "        attention_vectors = attention_vectors.view(batch_size, self.M, self.features, 1, 1)\n",
    "        attention_vectors = self.softmax(attention_vectors)\n",
    "        \n",
    "        feats_V = torch.sum(feats*attention_vectors, dim=1)\n",
    "        \n",
    "        return feats_V\n",
    "\n",
    "\n",
    "\n",
    "def SKNet26(nums_class=1000):\n",
    "    return SKNet(nums_class, [2, 2, 2, 2])\n",
    "def SKNet50(nums_class=1000):\n",
    "    return SKNet(nums_class, [3, 4, 6, 3])\n",
    "def SKNet101(nums_class=1000):\n",
    "    return SKNet(nums_class, [3, 4, 23, 3])\n",
    "\n",
    "sknet=SKNet101()\n",
    "print(sknet)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a1b72b33",
   "metadata": {},
   "source": [
    "## 定义优化器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "af29e5e8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1250\n"
     ]
    }
   ],
   "source": [
    "import torch.optim as optim\n",
    "\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9)\n",
    "print(len(train_loader))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2bc43de9",
   "metadata": {},
   "source": [
    "## 训练网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "df16afc4",
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'top1Correct' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32mC:\\WINDOWS\\TEMP/ipykernel_29476/2025183058.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m     31\u001b[0m             \u001b[0mtop5Predicted\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtopk\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0moutputs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mk\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdim\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlargest\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     32\u001b[0m             \u001b[0mtotal\u001b[0m \u001b[1;33m+=\u001b[0m \u001b[0mlabels\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msize\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 33\u001b[1;33m             \u001b[0mtop1Correct\u001b[0m \u001b[1;33m+=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mtop1Predicted\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0mlabels\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msum\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     34\u001b[0m             \u001b[0mlabel_resize\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mlabels\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mview\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mexpand_as\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtop5Predicted\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     35\u001b[0m             \u001b[0mtop5Correct\u001b[0m \u001b[1;33m+=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0meq\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtop5Predicted\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlabel_resize\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mview\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msum\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfloat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'top1Correct' is not defined"
     ]
    }
   ],
   "source": [
    "lossList = []\n",
    "top1AccuracyList = []   # top1准确率列表\n",
    "top5AccuracyList = []   # top5准确率列表\n",
    "max_epoch = 2\n",
    "for epoch in range(max_epoch):  # loop over the dataset multiple times\n",
    "\n",
    "    running_loss = 0.0\n",
    "    for i, data in enumerate(train_loader, 0):\n",
    "        # get the inputs; data is a list of [inputs, labels]\n",
    "        inputs, labels = data\n",
    "#         print(labels)\n",
    "#         print(len(inputs))\n",
    "\n",
    "        # zero the parameter gradients\n",
    "        optimizer.zero_grad()\n",
    "\n",
    "        # forward + backward + optimize\n",
    "        outputs = net(inputs)\n",
    "#         print(outputs)\n",
    "#         print(labels)\n",
    "        loss = criterion(outputs, labels)\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        total=0\n",
    "        for data in test_loader:\n",
    "            images, labels = data\n",
    "            # calculate outputs by running images through the network\n",
    "            outputs = net(images)\n",
    "            # the class with the highest energy is what we choose as prediction\n",
    "            _, top1Predicted = torch.max(outputs.data, 1)\n",
    "            top5Predicted = torch.topk(outputs.data, k=5, dim=1, largest=True)[0]\n",
    "            total += labels.size(0)\n",
    "            top1Correct += (top1Predicted == labels).sum().item()\n",
    "            label_resize = labels.view(-1, 1).expand_as(top5Predicted)\n",
    "            top5Correct += torch.eq(top5Predicted, label_resize).view(-1).sum().float().item()\n",
    "\n",
    "        # print statistics\n",
    "        running_loss += loss.item()\n",
    "        # 每100个mini-batch输出一次准确率\n",
    "        if i % 100 == 99:    # print every 100 mini-batches\n",
    "            # since we're not training, we don't need to calculate the gradients for our outputs\n",
    "            total = 0\n",
    "            top1Correct = 0\n",
    "            top5Correct = 0\n",
    "            with torch.no_grad():\n",
    "                for data in test_loader:\n",
    "                    images, labels = data\n",
    "                    # calculate outputs by running images through the network\n",
    "                    outputs = net(images)\n",
    "                    # the class with the highest energy is what we choose as prediction\n",
    "                    _, top1Predicted = torch.max(outputs.data, 1)\n",
    "                    top5Predicted = torch.topk(outputs.data, k=5, dim=1, largest=True)[0]\n",
    "                    total += labels.size(0)\n",
    "                    top1Correct += (top1Predicted == labels).sum().item()\n",
    "                    label_resize = labels.view(-1, 1).expand_as(top5Predicted)\n",
    "                    top5Correct += torch.eq(top5Predicted, label_resize).view(-1).sum().float().item()\n",
    "            print(f'[{epoch + 1}, {i + 1:5d}] top1Accuracy: {100 * top1Correct / total} %')\n",
    "            print(f'[{epoch + 1}, {i + 1:5d}] top5Accuracy: {100 * top5Correct / total} %')\n",
    "            print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}')\n",
    "            top1AccuracyList.append(top1Correct / total)\n",
    "            top5AccuracyList.append(top5Correct / total)\n",
    "            lossList.append(running_loss / 100)\n",
    "            running_loss = 0.0\n",
    "\n",
    "print('Finished Training')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1d660104",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 绘制曲线\n",
    "plt.figure(figsize=(5,3))\n",
    "plt.plot(np.arange(1,len(lossList)), lossList)\n",
    "plt.title('validation loss')\n",
    "\n",
    "plt.figure(figsize=(5,3))\n",
    "plt.plot(np.arange(1,len(top1AccuracyList)), top1AccuracyList)\n",
    "plt.title('validation top1 accuracy')\n",
    "\n",
    "plt.figure(figsize=(5,3))\n",
    "plt.plot(np.arange(1,len(top5AccuracyList)), top5AccuracyList)\n",
    "plt.title('validation top5 accuracy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c507f975",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 保存模型\n",
    "PATH = './cifar_ResNet.pth'\n",
    "torch.save(net.state_dict(), PATH)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8529d621",
   "metadata": {},
   "source": [
    "## 在测试集上测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b18091e4",
   "metadata": {},
   "outputs": [],
   "source": [
    "top1Correct = 0\n",
    "top5Correct = 0\n",
    "total = 0\n",
    "# since we're not training, we don't need to calculate the gradients for our outputs\n",
    "with torch.no_grad():\n",
    "    for data in test_loader:\n",
    "        images, labels = data\n",
    "        # calculate outputs by running images through the network\n",
    "        outputs = net(images)\n",
    "        # the class with the highest energy is what we choose as prediction\n",
    "        _, predicted = torch.max(outputs.data, 1)\n",
    "        top5Predicted = torch.topk(outputs.data, k=5, dim=1, largest=True)[0]\n",
    "        total += labels.size(0)\n",
    "        top1Correct += (predicted == labels).sum().item()\n",
    "        label_resize = labels.view(-1, 1).expand_as(top5Predicted)\n",
    "        top5Correct += torch.eq(top5Predicted, label_resize).view(-1).sum().float().item()\n",
    "\n",
    "print(f'Top1 Accuracy of the network on the  test images: {100 * top1Correct // total} %')\n",
    "print(f'Top5 Accuracy of the network on the  test images: {100 * top5Correct // total} %')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
